package com.example.java.utils;

import java.util.NoSuchElementException;
import java.util.Optional;

// 一个容器对象，可能包含也可能不包含非null值。如果存在值，则isPresent()返回true。如果没有值，则对象被视为空，isPresent()返回false。
public class OptionalMain {
    public static void main(String[] args) {
        // 创建 Optional 对象，内容必须是非 null 值
        Optional<String> optional = Optional.of("Hello World");
        String str = optional.get();// 直接获取值，如果为空则抛出异常 NullPointerException
        // 返回描述给定值的Optional（如果非null），否则返回一个空的Optional
        Optional<String> optional2 = Optional.ofNullable(str);


        // 返回一个空的Optional实例。 这个方法可以用来创建 Optional 实例，但是不包含任何值。
        Optional<Object> emptyOptional = Optional.empty();
        // 判断是否为空
        if (emptyOptional.isEmpty()) {
            System.out.println("Optional is empty.");
            System.out.println("Value is not present.");
        }

        // 不带参数的 isPresent() 方法用于判断 Optional 对象是否包含值
        // 判断是否存在值
        if (optional.isPresent()) {
            // 获取值
            String value = optional.get();
            System.out.println(value);
            System.out.println("Value is present.");
        }
        // 如果存在值，则使用 Consumer 消费接口对该值执行给定操作，否则不执行任何操作
        optional.ifPresent(value -> System.out.println("Value is present: " + value));
        // 如果存在值，则使用 Consumer 消费接口对该值执行给定操作，否则执行给定的 Runnable 接口
        optional.ifPresentOrElse(value -> System.out.println("Value is present: " + value), () -> System.out.println("Value is not present."));


        // 如果存在值，则返回描述该值的Optional，否则返回由提供的 Supplier 函数生成的Optional
        optional.or(() -> Optional.of("Default Value"));// 如果为空，则返回默认值

        // 如果存在值，则返回该值，否则返回 other
        String defaultValue1 = optional.orElse("Default Value");
        // 如果存在值，则返回该值，否则返回由提供的 Supplier 函数生成的结果
        String defaultValue2 = optional.orElseGet(() -> "Default Value");// 如果为空，则返回默认值
        // 如果存在值，则返回该值，否则抛出 NoSuchElementException 异常
        String defaultValue3 = optional.orElseThrow();
        // 如果存在值，则返回该值，否则抛出由提供的 Supplier 函数生成的异常
        String defaultValue4 = optional.orElseThrow(NoSuchElementException::new);// 如果为空，则抛出异常


        // 如果存在值，并且该值与给定的断言匹配，则返回描述该值的Optional，否则返回一个空的Optional
        optional.filter(value -> value.length() > 5)
                .ifPresent(value -> System.out.println("Value is longer than 5 characters“：" + value));

        // 如果存在值，则返回描述该值的Optional（如同通过ofNullable(T)）应用给定映射函数的结果，否则返回一个空的Optional
        optional.map(String::toUpperCase)
                .ifPresent(value -> System.out.println("Uppercase value: " + value));

        // 如果存在值，则返回一个仅包含该值的顺序Stream，否则返回一个空的Stream
        optional.stream()
                .map(String::toUpperCase)
                .forEach(value -> System.out.println("Value: " + value));
    }
}


// 关于 Optional 空值 null 处理工具类的相关的使用参考官方文档 https://java.cunzaima.cn/jdk21/doc-zh/api/java.base/java/util/Optional.html
